package com.fz.publisher.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
public class MqConfirmConfig implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 从bean工厂中获取 RabbitTemplate 对象
        RabbitTemplate rabbitTemplate = applicationContext.getBean( RabbitTemplate.class );
        // 配置ReturnCallback
//        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
//            // 像这种里面只有一个方法的，把鼠标方法 new 前面，会提醒 推荐用lambda表达式，快捷键 Alt + Enter
//            @Override
//            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
//
//            }
//        });
        // 像这种里面只有一个方法的，把鼠标方法 new 前面，会提醒 推荐用lambda表达式，快捷键 Alt + Enter
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            // 记录日志 【 {}是占位符，replyCode, replyText, exchange...会依次填进占位符里的 】
            log.error( "消息发送到队列失败，响应码：{}, 失败原因：{}, 交换机：{}, 路由key：{}, 消息：{}",
                    replyCode, replyText, exchange, routingKey, message.toString() );

            // 如果有需要的话，可以重发消息
        });
    }
}
